package com.shop.shopserver.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.BitSet;

/**
 * 单层布隆过滤器
 */
@Slf4j
public class BloomFilter {
    // 位集合
    private BitSet bitSet;
    // 该层布隆过滤器的大小
    private int size;
    // 该层布隆过滤器的哈希函数个数
    private int hashCount;

    public BloomFilter(int size, int hashCount) {
        this.size = size;
        this.hashCount = hashCount;
        bitSet = new BitSet(size);
    }

    // 添加元素
    public void add(String item) {
        for (int i = 0; i < hashCount; i++) {
            int index = hash(item, i);
            bitSet.set(index);
        }
    }

    // 判断元素是否存在
    public boolean contains(String item) {
        for (int i = 0; i < hashCount; i++) {
            int index = hash(item, i);
            if (!bitSet.get(index)) {
                return false;
            }
        }
        return true;
    }

    // 哈希函数
    private int hash(String item, int seed) {
        int hash = 0;
        for (int i = 0; i < item.length(); i++) {
            hash = hash * 31 + item.charAt(i);
        }
        return Math.abs((hash + seed) % size);
    }

    // 重置该层布隆过滤器
    public void reset() {
        // 重置位集合
        bitSet.clear();
    }
}
